/*
 * @Descripttion: 处理请求url参数工具函数
 * @content: 希望最终请求是url是拼接号params的，也就是拼接key-value。具体说明见doc/url.md
 * @Author: yangzhihao
 * @Date: 2021-07-09 16:24:01
 * @LastEditors: yangzhihao
 * @LastEditTime: 2021-07-12 15:43:52
 */

import { isDate, isObject } from '.'

function encode(val: string): string {
  return encodeURIComponent(val)
    .replace(/%40/g, '@')
    .replace(/%3A/gi, ':')
    .replace(/%24/g, '$')
    .replace(/%2C/gi, ',')
    .replace(/%20/g, '+')
    .replace(/%5B/gi, '[')
    .replace(/%5D/gi, ']')
}

export function buildURL(url: string, params?: any) {
  // 判断是否存在params
  if (!params) {
    return url
  }
  // 最终存放的key-value数组
  const parts: string[] = []

  Object.keys(params).forEach(key => {
    let val = params[key]
    // 排除val为null或者undefined
    if (val === null || typeof val === 'undefined') {
      return
    }
    // 临时存储values数组
    let values: string[]
    // 如果val是数组，key拼接[]字符串
    if (Array.isArray(val)) {
      values = val
      key += '[]'
    } else {
      // 强行塞进数组
      values = [val]
    }
    // 判断是否是事件或者对象格式,分别处理
    values.forEach(val => {
      if (isDate(val)) {
        val = val.toISOString()
      } else if (isObject(val)) {
        val = JSON.stringify(val)
      }
      // 最后处理特殊字符，空格等等
      parts.push(`${encode(key)}=${encode(val)}`)
    })
  })

  // &分割数组
  let serializedParams = parts.join('&')
  if (serializedParams) {
    // 判断是否存在哈希,存在直接干掉哈希
    const hashIndex = url.indexOf('#')
    if (hashIndex !== -1) {
      serializedParams = serializedParams.slice(0, hashIndex)
    }
    // 判断url是否已经存在?
    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
  }
  return url
}
